<!DOCTYPE HTML>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>Spring注解 › 但行好事，莫问前程</title>
  <meta name="author" content="fengbo">
  
  <meta name="description" content="不想当架构师的程序员不是好厨师 ，不认为PHP是世界上最好的编程语言的Python开发者不是一个好的Javaer。">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <meta property="og:title" content="Spring注解">
  <meta property="og:site_name" content="但行好事，莫问前程">

  
    <meta property="og:image" content="undefined">
  

  <link href="/favicon.png" rel="icon">
  <link rel="alternate" href="/atom.xml" title="但行好事，莫问前程" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">
  <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
  

</head>
</html>

<body>
  <header id="header"><div class="meta inner">
  <h1><a href="/">但行好事，莫问前程</a></h1>
  <h2><a href="/">CV工程师，了解面向Google编程的基本原理，有三年使用Google经验，在通往程序员的道路上艰难的爬行着。</a></h2>
  <nav id="main-nav">
    <ul>
      
      <li><a href="/">Home</a></li>
      
      <li><a href="/archives">Archives</a></li>
      
      <li><a href="/atom.xml">RSS</a></li>
      
    </ul>
    <div class="clearfix"></div>
  </nav>
</div>
<div class="clearfix"></div>
</header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper"><article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title">Spring注解</h1>
  

      
        <time datetime="2017-11-26T03:34:14.000Z">2017-11-26</time>
      
    </header>
    <div class="entry">
      
        <p><b>注解本身没有功能，和xml一样是一种元数据；元数据是解释数据的数据，即配置。</b><br><a id="more"></a></p>
<h3 id="声明bean的注解"><a href="#声明bean的注解" class="headerlink" title="声明bean的注解"></a>声明bean的注解</h3><ul>
<li>@Component：无明确角色，下面三个由它实现。</li>
<li>@Controller：控制层bean。</li>
<li>@Service：业务逻辑层bean。</li>
<li>@Repository：数据访问层bean。</li>
</ul>
<h3 id="注入bean的注解"><a href="#注入bean的注解" class="headerlink" title="注入bean的注解"></a>注入bean的注解</h3><ul>
<li>@Autowired：由Spring提供。</li>
<li>@Resource：由JSR-250提供。</li>
<li>@Qualifier(“userServiceImpl”)：当一个接口有多个实现类时，用来指明注入那个实现类。</li>
<li>@Required：此注解用于bean的setter方法上，表示此属性是必须的，必须在配置阶段注入，否则会抛出BeanInitializationExcepion。</li>
<li>@Autowired和@Resource区别和联系：<ol>
<li>都可以用来装配bean。都可以写在字段上或者setter方法上。</li>
<li>@Autowired默认<b>按类型装配</b>，默认情况下要求依赖对象必须存在，如果需要允许null值，可以设置它的required属性为false。如果我们想使用名称装配可以结合@Qualifier注解进行使用。</li>
<li>@Resource默认<b>按名称装配</b>，名称可以通过name属性进行指定，如果没有指定name属性，当注解写在字段上时默认取字段名，按照名称查找，如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是如果name属性被指定，就只会按照名称进行装配。</li>
</ol>
</li>
<li>@Inject：由JSR-330提供。</li>
</ul>
<h3 id="Spring配置类相关注解"><a href="#Spring配置类相关注解" class="headerlink" title="Spring配置类相关注解"></a>Spring配置类相关注解</h3><ul>
<li>@Configuration：声明当前类为配置类，相当于xml里面beans标签（类上）。</li>
<li>@Bean：声明当前方法的返回值为一个bean，相当于xml中的方式bean标签（方法上）。</li>
<li>@ComponentScan：用于对Component进行扫描，相当于xml中的&lt; context:component-scan base-package=”my.web”/&gt;（类上）。</li>
<li>@WishlyConfiguration：@Configuration与@ComponentScan的组合注解，可以替代这两个注解。</li>
<li>@Scope：设置bean的作用域。<ul>
<li>singleton(默认)：一个容器中只有一个实例，容器销毁是才会被销毁。 </li>
<li>protetype：每次都重新生成一个新的对象实例给请求方。即容器并不维护该类型对象的实例。</li>
<li>request：为每个HTTP请求创建一个新的对象实例(Web项目)。</li>
<li>session：为每个独立的session创建属于它们自己的对象实例(Web项目)。</li>
<li>globalSession：它会映射到portlet的global范围的session。如果在普通的基于servlet的Web应用中使用了这个类型的scope，容器会将其作为普通的session类型的scope对待(基于portlet的Web项目)。</li>
</ul>
</li>
<li>@PostConstruct：由JSR-250提供，在构造函数执行完之后执行，相当于xml配置文件中bean的initMethod和InitializingBean接口。</li>
<li>@PreDestory：由JSR-250提供，在Bean销毁之前执行，相当于xml配置文件中bean的destroyMethod和DisposableBean接口。</li>
</ul>
<h3 id="AOP相关注解"><a href="#AOP相关注解" class="headerlink" title="AOP相关注解"></a>AOP相关注解</h3><p><b>Spring支持AspectJ的注解式切面编程。可以使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持。</b></p>
<ul>
<li>@Aspect声明一个切面（类上）。</li>
<li>@PointCut声明切点（方法上）。</li>
<li>使用@After、@Before、@Around定义建言（advice），可直接将拦截规则（切点）作为参数。<ul>
<li>@After在方法执行之后执行（方法上）。</li>
<li>@Before在方法执行之前执行（方法上）。</li>
<li>@Around在方法执行之前与之后执行（方法上）。</li>
</ul>
</li>
</ul>
<h3 id="Value为属性注入值"><a href="#Value为属性注入值" class="headerlink" title="@Value为属性注入值"></a>@Value为属性注入值</h3><pre><code>// 注入普通字符
@Value(&quot;Michael Jackson&quot;)
String name;
// 注入操作系统属性
@Value(&quot;#{systemProperties[&apos;os.name&apos;]}&quot;)
String osName;
// 注入表达式结果
@Value(&quot;#{ T(java.lang.Math).random() * 100 }&quot;)
String randomNumber;
// 注入其它bean属性
@Value(&quot;#{domeClass.name}&quot;)
String name;
// 注入文件资源
@Value(&quot;classpath:com/hgs/hello/test.txt&quot;)
String Resource file;
// 注入网站资源
@Value(&quot;http://www.cznovel.com&quot;)
Resource url;
// 注入配置文件
@Value(&quot;${book.name}&quot;)
String bookName;
</code></pre><h3 id="ConfigurationProperties为属性注入值"><a href="#ConfigurationProperties为属性注入值" class="headerlink" title="@ConfigurationProperties为属性注入值"></a>@ConfigurationProperties为属性注入值</h3><pre><code>@Configuration
@ConfigurationProperties(value = &quot;classpath:mail.properties&quot;,
     ignoreUnknownFields = false, prefix = &quot;mail&quot;)
// ignoreUnknownFields：告诉SpringBoot在有属性不能匹配到声明的域的时候是否抛出异常，默认是ture，不抛异常。
public class MailConfiguration {
    @NotBlank
    private String host;
    private int port;
    private String from;
    private String username;
    private String password;
    @NotNull private Smtp smtp;
}
</code></pre><h3 id="环境切换"><a href="#环境切换" class="headerlink" title="环境切换"></a>环境切换</h3><ul>
<li>@Profile通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境，即通过配置来改变参数，例如开发和生产使用不同的配置（类或方法上）。</li>
<li>@Conditional：Spring4中可以使用此注解定义条件话的bean，通过实现Condition接口，并重写matches方法，从而决定该bean是否被实例化（方法上）。</li>
</ul>
<h3 id="异步相关"><a href="#异步相关" class="headerlink" title="异步相关"></a>异步相关</h3><ul>
<li>@EnableAsync 配置类中，通过此注解开启对异步任务的支持，叙事性AsyncConfigurer接口（类上）。</li>
<li>@Async在实际执行的bean方法使用该注解来申明其是一个异步任务（方法上或类上所有的方法都将异步，需要@EnableAsync开启异步任务）。</li>
</ul>
<h3 id="定时任务相关"><a href="#定时任务相关" class="headerlink" title="定时任务相关"></a>定时任务相关</h3><ul>
<li>@EnableScheduling在配置类上使用，开启计划任务的支持（类上）。</li>
<li>@Scheduled来申明这是一个定时任务（方法上，需先开启计划任务的支持）。<ul>
<li>cron：<a href="http://biaoming.iteye.com/blog/39532" target="_blank" rel="noopener">cron表达式</a></li>
<li>fixedDelay：上一个任务完成后，多少毫秒后再执行下一个任务。</li>
<li>fixedRate：上一个任务开启后，多少毫秒后再执行下一个任务。</li>
</ul>
</li>
</ul>
<h3 id="Enable-主要用来开启对xxx的支持。"><a href="#Enable-主要用来开启对xxx的支持。" class="headerlink" title="@Enable*主要用来开启对xxx的支持。"></a>@Enable*主要用来开启对xxx的支持。</h3><ul>
<li>@EnableAspectJAutoProxy开启对AspectJ自动代理的支持。</li>
<li>@EnableScheduling开启计划任务的支持。</li>
<li>@EnableWebMvc开启Web MVC的配置支持。</li>
<li>@EnableConfigurationProperties 开启对@ConfigurationProperties注解配置Bean的支持。</li>
<li>@EnableJpaRepositories开启对SpringData JPA Repository的支持。</li>
<li>@EnableTransactionManagement开启注解式事务的支持。</li>
<li>@EnableCaching开启注解式的缓存支持。</li>
</ul>
<h3 id="SpringBoot测试相关注解"><a href="#SpringBoot测试相关注解" class="headerlink" title="SpringBoot测试相关注解"></a>SpringBoot测试相关注解</h3><pre><code>@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class RedisTest {
}
</code></pre><h3 id="SpringBoot相关注解"><a href="#SpringBoot相关注解" class="headerlink" title="SpringBoot相关注解"></a>SpringBoot相关注解</h3><pre><code>// @SpringBootApplication注解等价于以默认属性使用 @Configuration、@EnableAutoConfiguration和@ComponentScan
@SpringBootApplication
// @EnableAutoConfiguration注解告诉SpringBoot“猜”你将如何想配置Spring,基于你已经添加jar依赖项。如果spring-boot-starter-web已经添加Tomcat和SpringMVC,这个注释自动将假设您正在开发一个web应用程序并添加相应的spring设置。
@EnableTransactionManagement
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
</code></pre>
      
    </div>
      
      <footer>
        
        
  
  <div class="tags">
    <a href="/tags/JavaWeb/">JavaWeb</a>
  </div>

        
  <div class="addthis addthis_toolbox addthis_default_style">
    
      <a class="addthis_button_facebook_like" fb:like:layout="button_count"></a>
    
    
      <a class="addthis_button_tweet"></a>
    
    
      <a class="addthis_button_google_plusone" g:plusone:size="medium"></a>
    
    
      <a class="addthis_button_pinterest_pinit" pi:pinit:layout="horizontal"></a>
    
    <a class="addthis_counter addthis_pill_style"></a>
  </div>
  <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js"></script>

      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>

<!-- 来必力City版安装代码 -->
<!-- <div id="lv-container" data-id="city" data-uid="MTAyMC8yOTQ5MS82MDU5">
<script type="text/javascript">
   (function(d, s) {
       var j, e = d.getElementsByTagName(s)[0];

       if (typeof LivereTower === 'function') { return; }

       j = d.createElement(s);
       j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
       j.async = true;

       e.parentNode.insertBefore(j, e);
   })(document, 'script');
</script>
<noscript>为正常使用来必力评论功能请激活JavaScript</noscript>
</div> -->
<!-- City版安装代码已完成 -->

</div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tagcloud">
  <h3 class="title">文章分类</h3>
  <div class="entry">
    <a href="/tags/JavaWeb/" style="font-size: 17.14px;">JavaWeb</a> <a href="/tags/Java基础/" style="font-size: 15.71px;">Java基础</a> <a href="/tags/Java高级特性/" style="font-size: 15.71px;">Java高级特性</a> <a href="/tags/Python/" style="font-size: 10px;">Python</a> <a href="/tags/Spring基础/" style="font-size: 14.29px;">Spring基础</a> <a href="/tags/WebRTC/" style="font-size: 10px;">WebRTC</a> <a href="/tags/其它/" style="font-size: 20px;">其它</a> <a href="/tags/分布式/" style="font-size: 11.43px;">分布式</a> <a href="/tags/硬件/" style="font-size: 12.86px;">硬件</a> <a href="/tags/计算机基础/" style="font-size: 18.57px;">计算机基础</a> <a href="/tags/设计模式/" style="font-size: 17.14px;">设计模式</a>
  </div>
</div>



    <div class="widget tagcloud">
    <h3 class="title">电子书</h3>
    <ul class="entry">
      <li class='link'><a href='http://www.duokan.com/' target="_blank">多看阅读</a>&nbsp;&nbsp;<a href='https://read.douban.com/' target="_blank">豆瓣阅读</a>&nbsp;&nbsp;<a href='http://e.dangdang.com/' target="_blank">当当阅读</a></li>
      <li class='link'><a href='http://www.ituring.com.cn/' target="_blank">图灵社区</a>&nbsp;&nbsp;<a href='https://www.epubit.com/' target="_blank">异步社区</a>&nbsp;&nbsp;<a href='https://www.geekbang.org/' target="_blank">极客空间</a></li>
    </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">友情链接</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://www.cnblogs.com/jietang/' target="_blank">唐洁的博客</a></li>
        
          <li class='link'><a href='http://rednaxelafx.iteye.com/' target="_blank">R大的博客</a></li>
        
          <li class='link'><a href='http://www.hollischuang.com/' target="_blank">阿里大神的博客</a></li>
        
          <li class='link'><a href='http://blog.csdn.net/IT_faquir/' target="_blank">IT_faquir的专栏</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">思维导图</h3>
      <ul class="entry">
        
          <li class='link'><a href='https://fengbo4213.github.io/img/开源协议.png' target="_blank">开源协议简介</a></li>
        
          <li class='link'><a href='https://www.processon.com/diagraming/5b0cf757e4b009aef58d4b9d' target="_blank">我的知识体系</a></li>
        
          <li class='link'><a href='https://www.processon.com/view/link/5a2a00e5e4b015e677290b4f' target="_blank">简单的网站架构</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">在线手册</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://v3.bootcss.com/' target="_blank">BootStrap官方手册</a></li>
        
          <li class='link'><a href='http://www.iconfont.cn/http://element.eleme.io/#/zh-CN/' target="_blank">阿里巴巴矢量图标库</a></li>
        
      </ul>
  </div>


  
<div class="widget tag">
  <h3 class="title">最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2123/08/30/基础之MySQL原理/">MySQL原理</a>
      </li>
    
      <li>
        <a href="/2024/01/01/其它之ClickHouse索引/">ClickHouse索引</a>
      </li>
    
      <li>
        <a href="/2023/12/17/其它之MySQL线程池/">MySQL线程池</a>
      </li>
    
      <li>
        <a href="/2023/12/16/其它之InnoDB性能优化基础/">InnoDB性能优化基础</a>
      </li>
    
      <li>
        <a href="/2023/12/03/其它之Java8之后的版本新特性/">Java8之后的版本新特性</a>
      </li>
    
  </ul>
</div>

</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">
  
  &copy; 2024 fengbo
  
</div>
<div class="clearfix"></div></footer>
  <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>



</body>
</html>

